package com.ingenio.siot.adapter;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.ingenio.siot.Adapter;
import com.ingenio.siot.entity.Movil;
import com.ingenio.siot.entity.TipoMovil;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;

public class MovilAdapter extends Adapter{
	
	public List<Movil> devolverTodos() throws Exception{
    	Connection conn = null;
    	List<Movil> moviles = new ArrayList<Movil>();
    	PreparedStatement stmt = null;
		try {
			conn = (Connection) abrirConexion();
			TipoMovilAdapter tma = new TipoMovilAdapter();
			TipoMovil tm = null;
    		String sel ="SELECT * from moviles where activo=1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		ResultSet result = stmt.executeQuery();
    		Movil m = null;
    		
    		while(result.next()){
    			Integer id = result.getInt("IdMovil");
    			String descripcion = result.getString("descMovil");
    			Integer idTipoMovil = result.getInt("IdTipoMovil");
    			String gps = result.getString("gps");
    			String patente = result.getString("patente");
    			tm = tma.devolverTipoMovil(idTipoMovil);
    			boolean activo = result.getBoolean("activo");
    			m = new Movil(id, descripcion, tm, gps, patente, activo); 
    			moviles.add(m);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
    	return moviles;
    }
	
	public Movil devolverMovil(Integer idMovil) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
		TipoMovilAdapter tma = new TipoMovilAdapter();
		TipoMovil tm = null;
    	Movil m = null;
    	try {
    		conn = (Connection) abrirConexion();
    		String query ="SELECT * FROM moviles WHERE IdMovil=? and activo=1";
    		stmt = (PreparedStatement) conn.prepareStatement(query);
    		stmt.setInt(1, idMovil);
    		ResultSet result = stmt.executeQuery();
    		if(result.next()){
    			Integer id = result.getInt("IdMovil");
    			String descripcion = result.getString("descMovil");
    			Integer idTipoMovil = result.getInt("IdTipoMovil");
    			String gps = result.getString("gps");
    			String patente = result.getString("patente");
    			tm = tma.devolverTipoMovil(idTipoMovil);
    			boolean activo = result.getBoolean("activo");
    			m = new Movil(id, descripcion, tm, gps, patente, activo); 
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
		return m;
	}
	
	public Movil devolverMovil(Integer idMovil, Connection conn) throws Exception{
		PreparedStatement stmt = null;
		TipoMovilAdapter tma = new TipoMovilAdapter();
		TipoMovil tm = null;
    	Movil m = null;
    	try {
    		String query ="SELECT * FROM moviles WHERE IdMovil=? and activo=1";
    		stmt = (PreparedStatement) conn.prepareStatement(query);
    		stmt.setInt(1, idMovil);
    		ResultSet result = stmt.executeQuery();
    		if(result.next()){
    			Integer id = result.getInt("IdMovil");
    			String descripcion = result.getString("descMovil");
    			Integer idTipoMovil = result.getInt("IdTipoMovil");
    			String gps = result.getString("gps");
    			String patente = result.getString("patente");
    			tm = tma.devolverTipoMovil(idTipoMovil);
    			boolean activo = result.getBoolean("activo");
    			m = new Movil(id, descripcion, tm, gps, patente, activo); 
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
		return m;
	}
	
	public List<Movil> devolverMovilesdesdeTipoMovil(TipoMovil tm) throws Exception{
    	Connection conn = null;
    	List<Movil> moviles = new ArrayList<Movil>();
    	PreparedStatement stmt = null;
		try {
			conn = (Connection) abrirConexion();
			String sel ="SELECT * from moviles WHERE IdTipoMovil=? and activo=1";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, tm.getIdTipoMovil());
    		ResultSet result = stmt.executeQuery();
    		Movil m = null;
    		
    		while(result.next()){
    			Integer id = result.getInt("idMovil");
    			String descripcion = result.getString("descMovil");
    			String gps = result.getString("gps");
    			String patente = result.getString("patente");
    			boolean activo = result.getBoolean("activo");
    			m = new Movil(id, descripcion, tm, gps, patente, activo);
    			moviles.add(m);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		//conn.close();
    		cerrarConexion(conn);
    	}
    	return moviles;
    }
	
	public List<Movil> devolverMovilesdesdeListaTipoMovil(List<TipoMovil> tiposMoviles) throws Exception{
    	Connection conn = null;
    	List<Movil> moviles = new ArrayList<Movil>();
    	TipoMovilAdapter tma = new TipoMovilAdapter();
    	PreparedStatement stmt = null;
    	if (tiposMoviles.size() > 0){
			try {
				conn = (Connection) abrirConexion();
				String query ="SELECT * from moviles WHERE IdTipoMovil IN (?"; //=? and activo=1";
	    		for (int i=1; i < tiposMoviles.size(); i++){
					query += ",?";
				}
				query += ") and activo = 1";
				
				stmt = (PreparedStatement) conn.prepareStatement(query);
				for (int i=1; i<= tiposMoviles.size(); i++){
	    			stmt.setInt(i, (tiposMoviles.get(i-1)).getIdTipoMovil());
	    		}
	    		
	    		ResultSet result = stmt.executeQuery();
	    		Movil m = null;
	    		
	    		while(result.next()){
	    			Integer id = result.getInt("idMovil");
	    			String descripcion = result.getString("descMovil");
	    			String gps = result.getString("gps");
	    			String patente = result.getString("patente");
	    			boolean activo = result.getBoolean("activo");
	    			Integer idTipoMovil = result.getInt("IdTipoMovil");
	    			m = new Movil(id, descripcion, tma.devolverTipoMovil(idTipoMovil) , gps, patente, activo);
	    			moviles.add(m);
	    		}
			}
			catch (Exception e) {
				e.printStackTrace();
				throw new Exception("Error al conectar con la base de datos.", e);
			}
	    	finally{
	    		//conn.close();
	    		cerrarConexion(conn);
	    	}
    	}
    	return moviles;
    }
	
	public Movil crearMovil(Movil movil) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
		MovilAdapter ma = new MovilAdapter();
		Movil m = null;
    	try {
    		conn = (Connection) abrirConexion();
    		String query ="INSERT INTO moviles(descMovil,IdTipoMovil,gps,patente,activo) VALUES(?,?,?,?,?)";
    		stmt = (PreparedStatement) conn.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
    		stmt.setString(1,movil.getDescMovil());
    		stmt.setInt(2,movil.getTipoMovil().getIdTipoMovil());
    		stmt.setString(3,movil.getGps());
    		stmt.setString(4,movil.getPatente());
    		stmt.setBoolean(5,movil.isActivo());
    		stmt.execute();
    		ResultSet id = stmt.getGeneratedKeys();
    		if (id.next()){
    			m = ma.devolverMovil(id.getInt(1));
    		}
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
    	return m;
	}
	
	public void editarMovil(Movil movil) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
		try {
    		conn = (Connection) abrirConexion();
    		String query =	"UPDATE moviles " +
    						"SET descMovil=?, IdTipoMovil=?, gps=?, patente=?, activo=? " +
    						"WHERE IdMovil=?";
    		stmt = (PreparedStatement) conn.prepareStatement(query);
    		stmt.setString(1,movil.getDescMovil());
    		stmt.setInt(2,movil.getTipoMovil().getIdTipoMovil());
    		stmt.setString(3,movil.getGps());
    		stmt.setString(4,movil.getPatente());
    		stmt.setBoolean(5,movil.isActivo());
    		stmt.setInt(6,movil.getIdMovil());
    		stmt.execute();
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
	}
	
	public void eliminarMovil(Integer idMovil) throws Exception{
		Connection conn = null;
		PreparedStatement stmt = null;
    	try {
    		conn = (Connection) abrirConexion();
    		String query =  "UPDATE moviles SET activo=0 WHERE IdMovil=?";
    		stmt = (PreparedStatement) conn.prepareStatement(query);
    		stmt.setInt(1,idMovil);
    		stmt.execute();
    	}
    	catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
	}

}
